package net.club.services.gestion.actividad;

import java.util.Iterator;
import java.util.List;

import net.club.beans.Actividad;
import net.club.beans.EstadoActividad;
import net.club.beans.Subsistemacontable;
import net.club.services.AbstractService;
import net.club.services.constants.ICONSTANTES_ERRORS;
import beans.club.services.AbstractBeanInput;
import beans.club.services.AbstractBeanOutput;
import beans.club.services.actividad.ABMCActividadInput;
import beans.club.services.actividad.ABMCActividadOutput;


public class ActividadServiceImpl extends AbstractService implements IActividadService {
    /**
         *
         */
    private static final long serialVersionUID = -2478201362314173594L;

    public ActividadServiceImpl() {
    }

    @Override
    protected AbstractBeanOutput alta(AbstractBeanInput inputAbs,
        List<String> errores) {
        boolean result = false;
        ABMCActividadInput input = (ABMCActividadInput) inputAbs;
        ABMCActividadOutput output = new ABMCActividadOutput();

        if (!validateABMCBean(input, errores)) {
            result = false;
        }

        Subsistemacontable subsistemacontable = (Subsistemacontable) getEntity(input.getActividad()
                                                                                    .getSubsistemacontableBean()
                                                                                    .getUriEntidad(),
                Subsistemacontable.class);
        Actividad actividad = (Actividad) getEntity(input.getActividad()
                                                         .getUriEntidad(),
                Actividad.class);
        actividad.setSubsistemacontable(subsistemacontable);

        if (daoActividad.create(actividad)) {
            result = true;
        }

        output.setErrores(errores);
        output.setResponse(result);

        return output;
    }

    private boolean validateABMCBean(ABMCActividadInput input,
        List<String> errores) {
        if (input.getActividad() == null) {
            errores.add(ICONSTANTES_ERRORS.BEAN_ACTIVIDAD_NULO);

            return false;
        }

        if (input.getActividad().getSubsistemacontableBean() == null) {
            errores.add(ICONSTANTES_ERRORS.BEAN_SUBSIST_CONTABLE_NULO);

            return false;
        }

        return true;
    }

    @Override
    protected AbstractBeanOutput baja(AbstractBeanInput inputAbs,
        List<String> errores) {
        boolean result = false;
        ABMCActividadInput input = (ABMCActividadInput) inputAbs;
        ABMCActividadOutput output = new ABMCActividadOutput();

        if (!validateABMCBean(input, errores)) {
            result = false;
        }

        Actividad actividad = (Actividad) getEntity(input.getActividad()
                                                         .getUriEntidad(),
                Actividad.class);

        if (actividad != null) {
            List<EstadoActividad> estados = daoEstadoActividad.findAll();

            for (Iterator<EstadoActividad> it = estados.iterator();
                    it.hasNext();) {
                EstadoActividad estado = it.next();

                if (estado.getNombre().equals("BAJA")) {
                    actividad.setEstado(estado);

                    if (daoActividad.update(actividad)) {
                        result = true;
                    }

                    result = true;

                    break;
                }
            }
        }

        output.setErrores(errores);
        output.setResponse(result);

        return output;
    }

    @Override
    protected AbstractBeanOutput consulta(AbstractBeanInput inputAbs,
        List<String> errores) {
        boolean result = false;
        ABMCActividadInput input = (ABMCActividadInput) inputAbs;
        ABMCActividadOutput output = new ABMCActividadOutput();

        if (!validateABMCBean(input, errores)) {
            result = false;
        }

        //TODO con detachedCriteria realizar los filtros.
        super.consulta(input, errores);
        output.setErrores(errores);
        output.setResponse(result);

        return output;
    }

    /* (non-Javadoc)
	 * @see net.club.services.gestion.usuario.IActividadService#process(beans.club.services.AbstractBeanInput)
	 */
    public AbstractBeanOutput process(AbstractBeanInput input) {
        return super.doProcess(input);
    }
    @SuppressWarnings("unused")
	private List<Subsistemacontable> getSubsistemasContables(){
    	return daoSubsistemaContable.findAll();
    }
    @Override
    protected AbstractBeanOutput modificacion(AbstractBeanInput inputAbs,
        List<String> errores) {
        boolean result = false;
        ABMCActividadInput input = (ABMCActividadInput) inputAbs;
        ABMCActividadOutput output = new ABMCActividadOutput();

        if (!validateABMCBean(input, errores)) {
            result = false;
        }

        Subsistemacontable subsistemacontable = (Subsistemacontable) getEntity(input.getActividad()
                                                                                    .getSubsistemacontableBean()
                                                                                    .getUriEntidad(),
                Subsistemacontable.class);

        if (subsistemacontable == null) {
            errores.add(ICONSTANTES_ERRORS.SUBSIST_CONT_INVALIDO);
            output.setErrores(errores);
            output.setResponse(false);

            return output;
        }

        Actividad actividad = (Actividad) getEntity(input.getActividad()
                                                         .getUriEntidad(),
                Actividad.class);

        if (actividad == null) {
            errores.add(ICONSTANTES_ERRORS.ACTIVIDAD_INVALIDA);
            output.setErrores(errores);
            output.setResponse(false);

            return output;
        }

        actividad.setSubsistemacontable(subsistemacontable);

        //TODO bindear con dozer
        if (daoActividad.update(actividad)) {
            result = true;
        }

        result = true;

        output.setErrores(errores);
        output.setResponse(result);

        return output;
    }
}
